cargo-install: prefer building artifacts in the system temporary directory
authorJorge Aparicio <japaricious@gmail.com>
Fri, 22 Apr 2016 22:49:12 +0000 (17:49 -0500)
committerJorge Aparicio <japaricious@gmail.com>
Fri, 22 Apr 2016 22:49:12 +0000 (17:49 -0500)
and each cargo-install instance creates and uses its own build directory. This
allows running several cargo-install instances in parallel.

If we fail to create a temporary directory for whatever reason fallback to
creating and using a target-install directory in the current directory.

closes #2606

Cargo.toml
src/cargo/lib.rs
src/cargo/ops/cargo_install.rs

index 3c2649005d422f36369f067130122990ca84afc3..b522909ad5cd5fd1d9c3a2ba270546eb2c82e69c 100644 (file)
@@ -38,6 +38,7 @@ regex = "0.1"
 rustc-serialize = "0.3"
 semver = "0.2.2"
 tar = "0.4"
+tempdir = "0.3"
 term = "0.4.4"
 time = "0.1"
 toml = "0.1"
@@ -45,7 +46,6 @@ url = "0.2"
 winapi = "0.2"
 
 [dev-dependencies]
-tempdir = "0.3"
 hamcrest = "0.1"
 bufstream = "0.1"
 filetime = "0.1"
index 2d5db07fa11d7acbea2ff24895ed56239908a8ce..ae67abc1bc1f63d3217eb9247cd960cf552f375c 100644 (file)
@@ -19,6 +19,7 @@ extern crate regex;
 extern crate rustc_serialize;
 extern crate semver;
 extern crate tar;
+extern crate tempdir;
 extern crate term;
 extern crate time;
 extern crate toml;
index 916e35bd7079a3a32719c4dc10497b6f257ce831..aab9c1e25af2d2964073db51a22f44cbcf615617 100644 (file)
@@ -7,6 +7,7 @@ use std::io::prelude::*;
 use std::io::SeekFrom;
 use std::path::{Path, PathBuf};
 
+use tempdir::TempDir;
 use toml;
 
 use core::{SourceId, Source, Package, Registry, Dependency, PackageIdSpec};
@@ -79,13 +80,25 @@ pub fn install(root: Option<&str>,
         try!(check_overwrites(&dst, &pkg, &opts.filter, &list));
     }
 
+    let mut td_opt = None;
     let target_dir = if source_id.is_path() {
         config.target_dir(&pkg)
     } else {
-        Filesystem::new(config.cwd().join("target-install"))
+        if let Ok(td) = TempDir::new("cargo-install") {
+            let p = td.path().to_owned();
+            td_opt = Some(td);
+            Filesystem::new(p)
+        } else {
+            Filesystem::new(config.cwd().join("target-install"))
+        }
     };
     config.set_target_dir(target_dir.clone());
     let compile = try!(ops::compile_pkg(&pkg, Some(source), opts).chain_error(|| {
+        if let Some(td) = td_opt.take() {
+            // preserve the temporary directory, so the user can inspect it
+            td.into_path();
+        }
+
         human(format!("failed to compile `{}`, intermediate artifacts can be \
                        found at `{}`", pkg, target_dir.display()))
     }));